Handshake failed due to an unspected packet format

Hi team,

I tried the sample code provided previously on a C# console project, which worked.

I however found the same set of code not working in a web application project (MVC.Net) when I paste the code in C# controller. I am getting the following error. Pasted the full code below and masked the api key and api secret.

image

        static void Main(string[] args)
{
DateTime dateValue = DateTime.UtcNow; // get the datetime NOW GMT
string date = dateValue.ToString("R"); // WC1 header requires GMT datetime stamp
Console.WriteLine(date);
//set host and credentials to the WC1 API Pilot server WC1SampleClientAPI account
string gatewayurl = "/v1/";
string gatewayhost = "rms-world-check-one-api-pilot.thomsonreuters.com";
// Here is where you enter your api keys
string apikey = "";
string apisecret = "";
string requestendpoint = "https://rms-world-check-one-api-pilot.thomsonreuters.com/v1/groups";
// Assemble the GET request - NOTE every character including spaces have to be EXACT
// for the API server to decode the authorization signature
string dataToSign = "(request-target): get " + gatewayurl + "groups\n" +
"host: " + gatewayhost + "\n" + // no https only the host name
"date: " + date; // GMT date as a string
// The Request and API secret are now combined and encrypted
string hmac = generateAuthHeader(dataToSign, apisecret);
// Assemble the authorization string - This needs to match the dataToSign elements
// i.e. requires ONLY host date (no content body for a GET request)
//- NOTE every character including spaces have to be EXACT else decryption will fail with 401 Unauthorized
string authorisation = "Signature keyId=\"" + apikey + "\",algorithm=\"hmac-sha256\",headers=\"(request-target) host date\",signature=\"" + hmac + "\"";
// Send the Request to the API server
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(requestendpoint);
// Set the Headers
WebReq.Method = "GET";
WebReq.Headers.Add("Authorization", authorisation);
WebReq.Headers.Add("Cache-Control", "no-cache");
WebReq.Date = dateValue; // use datetime value GMT time
// Get the Response - Status OK
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
// Status information about the request
Console.WriteLine(WebResp.StatusCode);
Console.WriteLine(WebResp.ResponseUri);
// Get the Response data
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
string jsontxt = _Answer.ReadToEnd();
// convert json text to a pretty printout
//var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsontxt);
//var f = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
//Console.WriteLine(f);
Console.WriteLine("Press any key");
Console.ReadKey(); // pause for any key
}
// Combine the data signature and the API secret key to get the HMAC
// This is the Microsoft HMACSHA256 code copied from the documentation
public static string generateAuthHeader(string dataToSign, string apisecret)
{
byte[] secretKey = Encoding.UTF8.GetBytes(apisecret);
HMACSHA256 hmac = new HMACSHA256(secretKey);
hmac.Initialize();
byte[] bytes = Encoding.UTF8.GetBytes(dataToSign);
byte[] rawHmac = hmac.ComputeHash(bytes);
return (Convert.ToBase64String(rawHmac));
}

Thanks

Best Answer

  • Irfan.Khan
    Answer ✓

    Hello @cliff.ching ,

    Can you please elaborate the issue that you are facing? Request you to be descriptive so that I can assist. Are you suggesting that your API requests are not reaching our WC1 API?

    Let us know the error when you run the code to interact with WC1 API.

    Kindly let us know the reason for connection logs from our end. If you like to check if your server is connecting well to ours, I have already suggested you to use Postman. Alternatively, you can use HTTP cURL to test your connections or may be run the sample code in your C# console project.

    Thanks.

Answers

  • Hello @cliff.ching ,

    Can you check the port number you are using to connect? Is it 80 or 443?

    You need to connect to the port number 443 for a HTTPS connection.

  • Hi,

    The port is set to 443 originally. Hence, should not be the reason.

    We tried adding WebReq.Proxy = new WebProxy("proxyapbusiness.cib.net", 3125);

    and we manage to get a web response which stated that URL is Forbidden. Kindly advice.

    image

  • Hello @cliff.ching ,

    I have checked the sample .NET code and it seems to be working fine.

    The first error reported generally occurs due to wrong port number or may be invalid SSL connection from the client's end.
    As I have not used MVC.net, I am not aware of its internal working and hence do not have any comments to add to this.

  • Hi,

    Is there a way to test the connection with the API using web browser ? We are trying to check the connections using this method.

    What should a except to see if I go to the uri link ?

  • Can we get any connection log ?

  • Hello @cliff.ching ,

    You cannot test the connection using the web browser. If you run the URI in the browser, you will get a 401 error.

    I advise you to use Postman to test your connections. I recommend the native Postman app. You can download the Postman collection and environment from the developers community and import them to the Postman, to test the APIs and if they are connecting correctly.

    You will a get a detailed logs of your API requests in the Postman Console logs after you have send your API requests using Postman.

  • Hi,

    Can we get any connection log from your end ?